package com.zhaotianhao.serviceorder.service.impl;

import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhaotianhao.serviceorder.api.CartApi;
import com.zhaotianhao.serviceorder.api.ProductApi;
import com.zhaotianhao.serviceorder.api.StockApi;
import com.zhaotianhao.serviceorder.common.JsonResult;
import com.zhaotianhao.serviceorder.dto.OrderDto;
import com.zhaotianhao.serviceorder.entity.Order;
import com.zhaotianhao.serviceorder.entity.OrderDetail;
import com.zhaotianhao.serviceorder.entity.OrderStatus;
import com.zhaotianhao.serviceorder.entity.PayLog;
import com.zhaotianhao.serviceorder.mapper.OrderMapper;
import com.zhaotianhao.serviceorder.service.IOrderDetailService;
import com.zhaotianhao.serviceorder.service.IOrderService;
import com.zhaotianhao.serviceorder.service.IOrderStatusService;
import com.zhaotianhao.serviceorder.service.IPayLogService;
import com.zhaotianhao.serviceorder.vo.CartVo;
import com.zhaotianhao.serviceorder.vo.OrderVo;
import com.zhaotianhao.serviceorder.vo.SkuVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Z-7
 * @since 2022-04-30
 */
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {
    @Autowired
    private CartApi cartApi;
    @Autowired
    private StockApi stockApi;
    @Autowired
    private ProductApi productApi;
    @Autowired
    private IPayLogService iPayLogService;
    @Autowired
    private IOrderStatusService iOrderStatusService;
    @Autowired
    private IOrderDetailService iOrderDetailService;

    /**
     * 获取下单的商品
     *
     * @param skuIds
     * @return
     */
    @Override
    public List<SkuVo> getSelectSku(List<Long> skuIds,Long userId) {
        CartVo cartVo = cartApi.getOrderCart(userId);
        List<SkuVo> skuVoList = cartVo.getSkuVoList();

        List<SkuVo> skuVos = new ArrayList<>();

        for (SkuVo skuVo : skuVoList) {
            for (Long skuId : skuIds) {
                if (skuVo.getId().equals(skuId)) {
                    skuVos.add(skuVo);
                }
            }
        }
        return skuVos;
    }

    /**
     * 库存鉴定
     *
     * @param skuVos
     * @return
     */
    @Override
    public Integer checkoutRepertory(List<SkuVo> skuVos) {
        List<Long> skuIds = skuVos.stream().map(skuVo -> skuVo.getId()).collect(Collectors.toList());
        List<Long> stockBySkuIds = stockApi.getStockBySkuIds(new OrderDto().setSkuIds(skuIds));
        // 判断库存数量
        for (int i = 0; i < skuIds.size(); i++) {
            if (skuVos.get(i).getNumber() > stockBySkuIds.get(i)) {
                return i;
            }
        }
        return null;
    }

    /**
     * 预扣库存
     *
     * @param skuVos
     * @return
     */
    @Override
    public Boolean updateStock(List<SkuVo> skuVos) {
        List<Long> skuIds = skuVos.stream().map(skuVo -> skuVo.getId()).collect(Collectors.toList());
        List<Long> skuNumbers = skuVos.stream().map(skuVo -> skuVo.getNumber()).collect(Collectors.toList());
        return stockApi.updateStockBySkuIds(new OrderDto().setSkuIds(skuIds).setSkuNumbers(skuNumbers));
    }

    /**
     * 清除购物车
     *
     * @param userId
     * @param skuVos
     * @return
     */
    @Override
    public Boolean clearCart(Long userId, List<SkuVo> skuVos) {
        List<Long> skuIds = skuVos.stream().map(skuVo -> skuVo.getId()).collect(Collectors.toList());
        JsonResult jsonResult = cartApi.deleteBySkuIds(new OrderDto().setSkuIds(skuIds).setUserId(userId));
        return jsonResult.getResult();
    }

    /**
     * 生成订单
     * @param skuVos
     * @param userId
     * @param username
     * @return
     */
    @Override
    public String createOrder(List<SkuVo> skuVos,Long userId,String username) {
        // 生成订单
        Long total = 0L;
        for (SkuVo skuVo : skuVos) {
            total += skuVo.getTotal() * 100;
        }
        Order order = new Order();
        order.setTotalPay(total).setActualPay(total).setPaymentType(true).setPostFee(0L)
                .setCreateTime(DateUtil.date()).setUserId(userId.toString()).setBuyerNick(username)
                .setBuyerRate(false).setSourceType(1);
        boolean save = save(order);
        // 生成订单明细

        List<OrderDetail> list = new ArrayList<>();
        for (SkuVo skuVo : skuVos) {
            OrderDetail orderDetail = new OrderDetail();
            orderDetail.setOrderId(order.getOrderId()).setSkuId(skuVo.getId())
                            .setNum(skuVo.getNumber().intValue()).setTitle(skuVo.getTitle())
                            .setOwnSpec(skuVo.getOwnSpec()).setPrice(skuVo.getTotal() * 100);
            list.add(orderDetail);
        }
        boolean detail = iOrderDetailService.saveBatch(list);
        // 订单状态
        OrderStatus orderStatus = new OrderStatus();
        orderStatus.setOrderId(order.getOrderId()).setStatus(1).setCreateTime(DateUtil.date());
        iOrderStatusService.save(orderStatus);
        // 支付日志
        PayLog payLog = new PayLog();
        payLog.setOrderId(order.getOrderId()).setTotalFee(total).setUserId(userId)
                .setStatus(false).setPayType(true)
                .setCreateTime(DateUtil.date());
        iPayLogService.save(payLog);
        return order.getOrderId().toString();
    }

    /**
     * 生成cartVo
     *
     * @param userId
     * @param skuVos
     * @return
     */
    @Override
    public CartVo createCartVo(long userId, List<SkuVo> skuVos) {
        // 生成订单
        Long total = 0L;
        for (SkuVo skuVo : skuVos) {
            total += skuVo.getTotal();
        }
        CartVo cartVo = new CartVo();
        return cartVo.setTotal(total).setSkuVoList(skuVos);
    }

    @Override
    public JsonResult getOrderById(OrderDto orderDto) {
        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("order_id",orderDto.getOrderId());
        Order order = getOne(queryWrapper);

        QueryWrapper<OrderDetail> query = new QueryWrapper<>();
        query.eq("order_id",order.getOrderId());
        List<OrderDetail> orderDetailList = iOrderDetailService.list(query);
        List<Long> skuIdList = orderDetailList.stream().map(orderDetail -> orderDetail.getSkuId()).collect(Collectors.toList());
        OrderDto orderdto = new OrderDto().setSkuIds(skuIdList);
        List<SkuVo> skuList = productApi.getCartSkuInfoByIds(orderdto);
        //设置小记
        skuList.forEach(skuVO -> {
            orderDetailList.forEach(orderDetail -> {
                if(skuVO.getId().longValue()==orderDetail.getSkuId().longValue()){
                    skuVO.setTotal(orderDetail.getPrice());
                    skuVO.setPrice(skuVO.getPrice());
                    skuVO.setNumber(new Long(orderDetail.getNum()));
                }
            });
        });
        OrderVo orderVO = new OrderVo();
        orderVO.setTotal(order.getTotalPay()).setSkuVoList(skuList);

        return JsonResult.successd(orderVO);
    }
}
